package likou.jindian;

/**
 * @Info: 需要把要变化的行列记录下来，用数组记录？用Set记录
 *  这个牛人用每一行的第一个，每一列的第一个数字作为变0标识。
 *  提取需要的效果，然后头脑风暴，想象怎么才能最快、最低耗空间，实现。
 * @Author: Tangxz
 * @Date: 2020/09/22 10:00
 */
public class _01_08 {
    public static void main(String[] args) {
        int[][] n = {{1,1,1},{1,0,1},{1,1,1}};
        setZeroes(n);
    }
    public static void setZeroes(int[][] matrix) {
        boolean isFirstRowHaveZero = false;
        boolean isFirstColHaveZero = false;
        //记录第一行和第一列是否有为0的
        for(int i = 0; i < matrix.length; i++) {
            if (matrix[i][0] == 0) {
                isFirstColHaveZero = true;
            }
        }
        for(int j = 0; j < matrix[0].length; j++) {
            if (matrix[0][j] == 0) {
                isFirstRowHaveZero = true;
            }
        }
        //记录非第一行第一列是否有为0 的，如果有，就直接放在第一行或者第一列处理
        for(int i = 1; i < matrix.length; i++) {
            for(int j = 1; j < matrix[i].length; j++) {
                if (matrix[i][j] == 0) {
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        for(int i = 1; i < matrix.length; i++) {
            for(int j = 1; j < matrix[i].length; j++) {
                //如果某一行或者某一列的第一个数为0，则该行/列所有元素为0
                if (matrix[0][j] == 0 || matrix[i][0] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        //如果第一行有为0 的
        for(int i = 0; i < matrix.length; i++) {
            if (isFirstColHaveZero) {
                matrix[i][0] = 0;
            }
        }

        //如果第一列有为0 的
        for(int j = 0; j < matrix[0].length; j++) {
            if (isFirstRowHaveZero) {
                matrix[0][j] = 0;
            }
        }
    }

}
